/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.ufg.inf.pos.bd;

import br.ufg.inf.pos.br.utils.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author luan
 */
public class LocalizacaoDaoImpl implements LocalizacaoDao{

     private Connection connection = null;
    private Statement statement = null;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;
    
    private final String COLUMN_NOME = "NOMELOCALIZACAO";
    private final String COLUMN_ID = "IDLOCALIZACAO";
    private final String COLUMN_DESCRICAO = "DESCRICAOLOCALIZACAO";
    private final String COLUMN_TIPOLOCALIZACAO = "TIPOLOCALIZACAO";
    
    @Override
    public int salvar(Localizacao localizacao) {
        int codigoInserido = 0;
  
        try {
            connection = ConnectionFactory.getConnection();
            preparedStatement = connection
                    .prepareStatement("insert into localizacao("+COLUMN_NOME+","+COLUMN_DESCRICAO+","+COLUMN_TIPOLOCALIZACAO+" ) values (?,?,?)", new String[]{COLUMN_ID});
            preparedStatement.setString(1, localizacao.getNomeLocalizacao());
            preparedStatement.setString(2, localizacao.getDescriçãoLocalizacao());
            preparedStatement.setString(3, localizacao.getTipoLocalizacao().getTipoLocalizacao());
            
            if (preparedStatement.executeUpdate() > 0) {
                resultSet = preparedStatement.getGeneratedKeys();
                if (null != resultSet && resultSet.next()) {
                    codigoInserido = resultSet.getInt(1);
                }
            }
        } catch (SQLException ex) {
            throw new RuntimeException("Erro ao recuperar objeto: "
                    + ex.getMessage());
        } finally {
            close();
            return codigoInserido;
        }
    }


    @Override
    public List<Localizacao> getAll() {
           List<Localizacao> localizacoes = new ArrayList<>();
        try {
            connection = ConnectionFactory.getConnection();
            statement = connection.createStatement();
            resultSet = statement.executeQuery(
                    "select * from localizacao order by localizacao."+COLUMN_NOME+"");
            while(resultSet.next()){
                Localizacao localizacaoLida = new Localizacao();
                localizacaoLida.setIdLocalizacao(resultSet.getInt(COLUMN_ID));
                localizacaoLida.setNomeLocalizacao(resultSet.getString(COLUMN_NOME));
                TipoLocalizacao tipoLoc = TipoLocalizacao.valueOf(resultSet.getString(COLUMN_TIPOLOCALIZACAO));
                switch(tipoLoc){
                    case INTERNO: 
                    localizacaoLida.setTipoLocalizacao(TipoLocalizacao.INTERNO);
                    tipoLoc = null;
                        break;
                case EXTERNO: 
                    localizacaoLida.setTipoLocalizacao(TipoLocalizacao.EXTERNO);
                     tipoLoc = null;    
                    break;
                }
                localizacaoLida.setDescriçãoLocalizacao(resultSet.getString(COLUMN_DESCRICAO));
                localizacoes.add(localizacaoLida);
            }
        } catch (SQLException ex) {
            throw new RuntimeException("Erro ao recuperar objeto: "
                    + ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException("Erro ao conectar-se ao banco: "
                    + ex.getMessage());
        } finally {
            close();
        }
        
        return localizacoes;
    }

    @Override
    public void atualizar(String nomeSetor, Localizacao localizacao) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void remover(Localizacao localizacao) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public DefaultTableModel listarCategoriaJtable() {
       DefaultTableModel tabelaModelo = new DefaultTableModel();
   tabelaModelo.setColumnIdentifiers(new String[]{"Setor", "Descrição","Local"});
            int posicao = 0;
        try {
            connection = ConnectionFactory.getConnection();
            statement = connection.createStatement();
            resultSet = statement.executeQuery(
                    "select * from localizacao order by localizacao."+COLUMN_NOME+"");
            while(resultSet.next()){
                tabelaModelo.insertRow(posicao, new Object[]{
                    resultSet.getString(COLUMN_NOME), resultSet.getString(COLUMN_DESCRICAO),
                resultSet.getString(COLUMN_TIPOLOCALIZACAO)});
                posicao++;
            }
        } catch (SQLException ex) {
            throw new RuntimeException("Erro ao recuperar objeto: "
                    + ex.getMessage());
        } finally {
            close();
            return tabelaModelo;
        }
    }
 
    // you need to close all three to make sure
    private void close() {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException("Erro ao fechar");
        }

    }

    @Override
    public Localizacao getByName(String nomeLocalizacao) {
         Localizacao localizacao = null;
        try {
            connection = ConnectionFactory.getConnection();
            preparedStatement = connection
                    .prepareStatement("select * from localizacao where localizacao."+COLUMN_NOME+" = ? ");
            preparedStatement.setString(1, nomeLocalizacao);
            resultSet = preparedStatement.executeQuery();
            if(resultSet.next()){
                localizacao = new Localizacao();
                 localizacao.setIdLocalizacao(resultSet.getInt(COLUMN_ID));
                localizacao.setNomeLocalizacao(resultSet.getString(COLUMN_NOME));
                TipoLocalizacao tipoLoc = TipoLocalizacao.valueOf(resultSet.getString(COLUMN_TIPOLOCALIZACAO));
                switch(tipoLoc){
                    case INTERNO: 
                    localizacao.setTipoLocalizacao(TipoLocalizacao.INTERNO);
                    tipoLoc = null;
                        break;
                case EXTERNO: 
                    localizacao.setTipoLocalizacao(TipoLocalizacao.EXTERNO);
                     tipoLoc = null;    
                    break;
                }
                localizacao.setDescriçãoLocalizacao(resultSet.getString(COLUMN_DESCRICAO));
               
            }else{
                close();
                throw new RuntimeException("Categoria não encontrada");
            }
        } catch (SQLException ex) {
            throw new RuntimeException("Erro ao recuperar objeto: "
                    + ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException("Erro ao conectar-se ao banco: "
                    + ex.getMessage());
        } finally {
            close();
            return localizacao;
        }
        
    }

    @Override
    public Localizacao getByName(String nomeLocalizacao, Connection conn) {
    Localizacao localizacao = null;
        try {
            preparedStatement = conn
                    .prepareStatement("select * from localizacao where localizacao."+COLUMN_NOME+" = ? ");
            preparedStatement.setString(1, nomeLocalizacao);
            resultSet = preparedStatement.executeQuery();
            if(resultSet.next()){
                localizacao = new Localizacao();
                 localizacao.setIdLocalizacao(resultSet.getInt(COLUMN_ID));
                localizacao.setNomeLocalizacao(resultSet.getString(COLUMN_NOME));
                TipoLocalizacao tipoLoc = TipoLocalizacao.valueOf(resultSet.getString(COLUMN_TIPOLOCALIZACAO));
                switch(tipoLoc){
                    case INTERNO: 
                    localizacao.setTipoLocalizacao(TipoLocalizacao.INTERNO);
                    tipoLoc = null;
                        break;
                case EXTERNO: 
                    localizacao.setTipoLocalizacao(TipoLocalizacao.EXTERNO);
                     tipoLoc = null;    
                    break;
                }
                localizacao.setDescriçãoLocalizacao(resultSet.getString(COLUMN_DESCRICAO));
               
            }else{
            conn.rollback();
            close();
                throw new RuntimeException("Categoria não encontrada");
            }
        } catch (SQLException ex) {
            conn.rollback();
            close();
            throw new RuntimeException("Erro ao recuperar objeto: "
                    + ex.getMessage());
        } finally {
            return localizacao;
        }
    
    }

   
}
